#include "gui_progress_bar.h"



static void bar_draw_part_event_cb(lv_event_t* e);
/***************************************************************************************************************
 * @ Brief 创建一个 status beet bar 对象
 * @ Param[in/out]parent
 * @ Param[in/out]x
 * @ Param[in/out]y
 * @ Return lv_obj_t*
 * @ Author Carter
 * @ Date 2025-04-16
 * @ details 用绘制和回调的方式理论闪更高效
*************************************************************************************************************** */
lv_obj_t* create_status_beet_bar(lv_obj_t* parent, int16_t x, int16_t y)
{
#if 0
    return  create_old_status_bar(parent, x, y);
#else
    static lv_style_t style_main;
    static lv_style_t style_indic;
    lv_obj_t* bar = lv_bar_create(parent);

    // 基础样式设置
    lv_obj_set_pos(bar, x, y);
    lv_obj_set_size(bar, 50, 4);
    lv_bar_set_range(bar, 0, 95);

    // 主部分样式
    lv_obj_set_style_radius(bar, 0, LV_PART_MAIN);
    lv_obj_set_style_bg_color(bar, lv_color_hex(0x222222), LV_PART_MAIN);

    // 指示器样式（设置为透明背景）
    lv_style_init(&style_indic);
    lv_style_set_bg_opa(&style_indic, LV_OPA_TRANSP );
    lv_obj_add_style(bar, &style_indic, LV_PART_INDICATOR);

    // 添加自定义绘制回调
    lv_obj_add_event_cb(bar, bar_draw_part_event_cb,
                        LV_EVENT_DRAW_PART_BEGIN | LV_EVENT_DRAW_PART_END, NULL);

    return bar;
#endif
}

static void bar_draw_part_event_cb(lv_event_t* e)
{
    lv_obj_t* obj = lv_event_get_target(e);
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_draw_part_dsc_t* dsc = lv_event_get_draw_part_dsc(e);

    if (code == LV_EVENT_DRAW_PART_BEGIN && dsc->part == LV_PART_INDICATOR)
    {
        // 禁用默认绘制
        dsc->rect_dsc->bg_opa = LV_OPA_TRANSP;
    }

    if (code == LV_EVENT_DRAW_PART_END && dsc->part == LV_PART_INDICATOR)
    {
        // 获取基础参数
        lv_area_t bar_coords;
        lv_obj_get_coords(obj, &bar_coords);
        lv_coord_t bar_w = lv_obj_get_width(obj);
        lv_coord_t bar_h = lv_obj_get_height(obj);

        // 渐变颜色定义
        lv_color_t start_color = lv_color_hex(0xF74B00);
        lv_color_t end_color = lv_color_hex(0x00B844);

        // 方块参数
        const lv_coord_t block_w = 2;    // 方块宽度
        const lv_coord_t block_h = 4;    // 方块高度
        const lv_coord_t gap = 2;        // 间隔
        const lv_coord_t period = block_w + gap; // 总周期

        // 计算垂直居中位置
        const lv_coord_t y_offset = (bar_h - block_h) / 2;

        // 遍历绘制方块
        for (lv_coord_t x = dsc->draw_area->x1; x <= dsc->draw_area->x2; x += period)
        {
            if (x + block_w - 1 > dsc->draw_area->x2)
            {
                break;
            }

            // 计算颜色插值
            lv_coord_t rel_x = (x - bar_coords.x1) % bar_w;
            uint8_t ratio = (rel_x * 255) / bar_w;
            lv_color_t color = lv_color_mix(start_color, end_color, ratio);

            // 创建方块区域
            lv_area_t block_area =
            {
                x,
                bar_coords.y1 + y_offset,
                x + block_w - 1,
                bar_coords.y1 + y_offset + block_h - 1
            };

            // 绘制配置
            lv_draw_rect_dsc_t rect_dsc;
            lv_draw_rect_dsc_init(&rect_dsc);
            rect_dsc.bg_opa = LV_OPA_COVER;
            rect_dsc.bg_color = color;
            rect_dsc.radius = 0;

            // 执行绘制
            lv_draw_rect(dsc->draw_ctx, &rect_dsc, &block_area);
        }
    }
}



lv_obj_t* create_old_status_bar(lv_obj_t* parent, int16_t  x, int16_t  y)
{
    static lv_style_t style;
    lv_obj_t* bar = lv_bar_create(parent);
    lv_obj_set_pos(bar, x, y);
    lv_obj_set_size(bar, 50, 4);
    lv_bar_set_range(bar, 0, 95);
    lv_obj_set_style_radius(bar, 0, LV_PART_MAIN);
    lv_obj_set_style_radius(bar, 0, LV_PART_INDICATOR);
    lv_obj_set_style_bg_color(bar, lv_color_hex(0x222222), LV_PART_MAIN);

    lv_style_init(&style);
    lv_style_set_opa(&style, LV_OPA_COVER);
    lv_style_set_bg_color(&style, lv_color_hex(0x00A2AB));
    lv_style_set_bg_grad_color(&style, lv_color_hex(0xFF7C23));
    lv_style_set_bg_grad_dir(&style, LV_GRAD_DIR_HOR);
    lv_obj_add_style(bar, &style, LV_PART_INDICATOR);

    return bar;
}

lv_obj_t* create_status_bar(lv_obj_t* parent, int16_t  x, int16_t  y)
{
    // 定义一个静态样式变量，用于后续设置进度条的样式
    static lv_style_t style;

    // 创建一个进度条对象，并将其父对象设置为传入的parent
    lv_obj_t* bar = lv_bar_create(parent);

    // 设置进度条的位置，x和y参数决定了进度条在父对象中的位置
    lv_obj_set_pos(bar, x, y);

    // 设置进度条的大小，宽度为50像素，高度为4像素
    lv_obj_set_size(bar, 50, 4);

    // 设置进度条的范围，从0到95，表示进度条的最小和最大值
    lv_bar_set_range(bar, 0, 95);

    // 设置进度条主部分（背景）的圆角为0，即没有圆角
    lv_obj_set_style_radius(bar, 0, LV_PART_MAIN);

    // 设置进度条指示器部分（填充部分）的圆角为0，即没有圆角
    lv_obj_set_style_radius(bar, 0, LV_PART_INDICATOR);

    // 设置进度条主部分（背景）的背景颜色为十六进制颜色值0x222222（深灰色）
    lv_obj_set_style_bg_color(bar, lv_color_hex(0x222222), LV_PART_MAIN);

    // 初始化样式变量style
    lv_style_init(&style);

    // 设置样式的不透明度为完全不透明（LV_OPA_COVER）
    lv_style_set_opa(&style, LV_OPA_COVER);

    // 设置样式背景颜色为十六进制颜色值 （绿色）
    lv_style_set_bg_color(&style, lv_color_hex(0x00B844));

    // 设置样式背景渐变颜色为十六进制颜色值 （红色）
    lv_style_set_bg_grad_color(&style, lv_color_hex(0xF74B00));

    // 设置样式背景渐变方向为水平（LV_GRAD_DIR_HOR）
    lv_style_set_bg_grad_dir(&style, LV_GRAD_DIR_HOR);

    // 将定义好的样式应用到进度条的指示器部分（填充部分）
    lv_obj_add_style(bar, &style, LV_PART_INDICATOR);

    // 创建一个方块容器，用于放置小方块
    lv_obj_t* square_container = lv_obj_create(bar);

    // 设置方块容器的大小，与进度条大小一致，宽度50像素，高度4像素
    lv_obj_set_size(square_container, 50, 4);

    // 设置方块容器的位置，使其与进度条对齐
    lv_obj_set_pos(square_container, 0, 0);

    // 设置方块容器的背景不透明度为透明（LV_OPA_TRANSP）
    lv_obj_set_style_bg_opa(square_container, LV_OPA_TRANSP, 0);

    // 设置方块容器的边框宽度为0，即没有边框
    lv_obj_set_style_border_width(square_container, 0, 0);

    // 创建2行4列的小方块（注意：这里循环中的col实际上是循环14次，可能是为了填充整个进度条）
    for (int row = 0; row < 2; row++) // 外层循环控制行，共2行
    {
        const int max_cols = (50 + 2) / (2 + 2); // =13列（2px方块+2px间隔）

        for (int col = 0; col < max_cols; col++) // 内层循环控制列，共14列
        {
            // 创建一个小方块对象，并将其父对象设置为方块容器
            lv_obj_t* square = lv_obj_create(square_container);

            // 设置小方块的大小，宽度为2像素，高度为4像素
            lv_obj_set_size(square, 2, 4);

            // 设置小方块的位置，col * 4表示水平间隔为4像素，row * 4表示垂直间隔为4像素
            lv_obj_set_pos(square, col * 4, row * 4);

            // 设置小方块的背景颜色为十六进制颜色值0x222222（深灰色）
            lv_obj_set_style_bg_color(square, lv_color_hex(0x222222), 0);

            // 设置小方块的不透明度为完全不透明（LV_OPA_COVER）
            lv_obj_set_style_bg_opa(square, LV_OPA_COVER, 0);

            // 设置小方块的圆角为0，即没有圆角
            lv_obj_set_style_radius(square, 0, 0);
        }
    }

    // 返回创建好的进度条对象
    return bar;
}
